package com.shenhaofeng.app.component.fragment;

import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.View;


/**
 * 用在Fragment中的懒加载控制器
 * Created by Administrator on 2016/5/23.
 */
public class LazyController {
    //标记view已创建
    private boolean isPrepared = false;
    //标记已加载
    private boolean isLoaded = false;

    private boolean mUserVisibleHint;

    private boolean isFirst = true;

    private Callback callback;


    /**
     * 构造方法，并传入回调方法
     *
     * @param callback
     */
    public LazyController(Callback callback) {
        this.callback = callback;
    }


    /**
     * 如果view已准备好请调用这个方法,如果不调用永远不会触发加载,在view被销毁时同样需要调用这个方法
     * 调用该方法将检查是否应该刷新数据，应该在{@link android.support.v4.app.Fragment#onViewCreated(View, Bundle)}中调用
     * 在{@link Fragment#onDestroyView()} 中调用
     *
     * @param isPrepared 是否准备好可以加载
     */
    public void setPrepared(boolean isPrepared) {
        this.isPrepared = isPrepared;
        //view被销毁将load状态重置
        if (!isPrepared) {
            isLoaded = false;
            isFirst = false;
        }
        lazyLoad();
    }


    /**
     * 务必在{@link android.support.v4.app.Fragment#setUserVisibleHint(boolean)}方法中调用
     *
     * @param isVisibleToUser
     */
    public void setUserVisibleHint(boolean isVisibleToUser) {
        this.mUserVisibleHint = isVisibleToUser;
        lazyLoad();
    }


    /**
     * 内部调用触发加载的方法
     */
    protected void lazyLoad() {
        if (isPrepared && mUserVisibleHint && !isLoaded) {
            onLazyLoad();
            isLoaded = true;
        }
    }


    /**
     * 一旦界面被用户可见,这个方法将会被调用
     */
    protected void onLazyLoad() {
        callback.onLazyLoad(isFirst);
        isFirst = false;
    }


    public interface Callback {
        /**
         * 一旦界面首次被用户可见,这个方法将会被调用,同一个fragment如果view被销毁 再调用isFirst为true
         */
        void onLazyLoad(boolean isFirst);
    }

}
